/**
 * @author luzhenfang
 * @date 2020 04 27
 * @description ts 面向对象编程 
 *  使用 class 关键字创建 类 
 *      统一构造函数为 constructor 不需要返回值
 *      成员变量定义在类中，并声明好类型
 *  继承：
 *      ts 只支持 单继承
 *      要继承的类必须存在
 *      使用  extends 关键字
 * 重写：
 *     子类可以重写父类方法
 *      super 关键字是父类的直接引用
 * static：
 *      用于定义类的数据成员（属性和方法） 为 静态的 ，静态成员可以直接通过类名调用。
 * instanceof ：
 *      用于判断 对象是否 是指定类型
 * 访问修饰符：
 *      public  公有  任何地方都可以被访问
 *      protected 受保护 可以被自身以及其子类 父类访问
 *      private 私有 只能被其定义所在的类访问
 * interface:
 *      类接口 用来规范类 
 * implements:
 *      当一个类实现该接口时 使用 此关键字
 * 
 */


class City{
    cName:string;
    cLevel:number;

    constructor(cName:string,cLevel:number){
        this.cName=cName;
        this.cLevel=cLevel;
    }
    about(){
        console.log(`兄得，你跳${this.cName}~危险系数为：${this.cLevel} 快跑吧！！！`);
    }
};
let city1 = new City("自闭城",5);
let city2 = new City("G港",4);
let city3 = new City("P城",3);
city1.about();
city2.about();
city3.about();

// 基类
class Shape{
    public static hello:string="我是基类"
    area:number
    constructor(area:number){
        this.area=area;
    }
    display():void{
        console.log(this.area);
    }
}
// 类 继承
class Circle extends Shape{
    // 方法重写
    display():void{
        // 直接引用父类
        super.display();
        console.log("子类也有。。");
    }
}

let obj = new Circle(10);
// 类变量
console.log(Shape.hello);
obj.display();

// interface

interface IPerson{
    sName:string;
    display():void;
}

// 实现 接口
class Person implements IPerson{
    sName: string;
    constructor(name:string){
        this.sName=name;
    }
    display(): void {
        console.log(this.sName);
        
    }
    
}
let p1 = new Person("小明");

p1.display();